package com.cskaoyan.javase.oop2._2polymorphic._3exercise;
/**
 * 读程序查看对象名点成员方法的执行结果
 * 先看引用的数据类型,确定访问范围:
 *      1.如果是父类类型,就只看父类一个就够了,不需要看子类.
 *      2,如果是子类类型,不能光看子类,还需要看父类
 *
 * 随后要根据对象的具体类型,来决定方法的调用结果.
 *
 * 除此之外,还要考虑就近原则
 * 
 * @since 11:43
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        System.out.println("1--" + a1.show(b));// AA
        System.out.println("2--" + a1.show(c)); // AA
        System.out.println("3--" + a1.show(d)); // AD
        System.out.println("4--" + a2.show(b)); // BA
        System.out.println("5--" + a2.show(c)); // BA
        System.out.println("6--" + a2.show(d)); // AD
        System.out.println("7--" + b.show(b)); // BB
        System.out.println("8--" + b.show(c)); // BB
        System.out.println("9--" + b.show(d)); // AD
    }
}
class A {
    public String show(D obj) {
        return ("A and D");
    }

    public String show(A obj) {
        return ("A and A");
    }
}
class B extends A {
    public String show(B obj) {
        return ("B and B");
    }
    @Override
    public String show(A obj) {
        return ("B and A");
    }
}
class C extends B {
}

class D extends B {
}